package org.jaaksi.test.webview;

import android.view.View;
import android.webkit.JavascriptInterface;
import android.widget.TextView;
import android.widget.Toast;
import org.jaaksi.test.webview.js.JsBridge;

/**
 * Android在4.4之前并没有提供直接调用js函数并获取值的方法.
 * 也就是说，我们只能调用JS中的函数，并不能得到该函数的返回值，想得到返回值我们就得想其它办法，所以在此之前，常用的思路是
 * java调用js方法，js方法执行完毕，再次调用java代码将值返回
 */
public class MyActivity extends BaseWebViewActivity {
    private TextView tvTitle;

    @Override
    protected void setContentView() {
        setContentView(R.layout.main);
        tvTitle = (TextView) findViewById(R.id.tv_title);
    }


    @Override
    protected String initCurrUrl() {
        return "file:///android_asset" + "/web/test.html";
    }

    @Override
    protected void registerJS() {
        // 注入的对象JSInterface的引用jsBridge
        // 我们已经把对象传给了JS，在JS中当然可以通过反射得到APP中的各种类的实例
        mWebView.addJavascriptInterface(new JsBridge(), "jsBridge");
    }

    public void onAction(View view) {
        /*javascript:伪协议让我们可以通过一个链接来调用JavaScript函数
        中间methodName是JavaScript中实现的函数
            jsonParams是传入的参数列表*/
        // javascript:methodName(params……)
        mWebView.loadUrl("javascript:prom()");
        mWebView.loadUrl("javascript:sum(2,3)");
    }

    /**
     * 定义一个js与Android交互的类，包含一个方法toast（这个方法是js中定义的，jsBridge为对象的引用，需要注册）
     * <button onclick="jsBridge.toast()">点击我调用android 方法</button>
     */
    final class JsBridge {
//    final class JsBridge implements org.jaaksi.test.webview.js.JsBridge{
        /**
         * 为了解决addJavascriptInterface()函数的安全问题，在android:targetSdkVersion数值为17（Android4.2）及以上的APP中，
         * JS只能访问带有 @JavascriptInterface注解的Java函数，所以如果你的android:targetSdkVersion是17+，
         * 与JS交互的Native函数中，必须添加JavascriptInterface注解，不然无效
         */
        @JavascriptInterface
        public void toast() {
            // Toast.makeText(MyActivity.this, "js调用Android方法", 1).show();
            toast("js调用Android方法");
        }

        /**
         * 与js中的方法名保持一致
         *
         * @param s
         */
        @JavascriptInterface
        public void toast(String s) {
            Toast.makeText(MyActivity.this, s, 1).show();
        }

        @JavascriptInterface
        public void setTitle(String title) {
            // 需要加runOnUiThread
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    tvTitle.setText(title);
                }
            });
        }
    }
}
